#include<iostream>
#include<dirent.h>
using namespace std;


// 步骤一：用opendir()函数打开目录。
// DIR *opendir(const char *pathname);
// 成功-返回目录的地址，失败-返回空地址。

// 步骤二：用readdir()函数循环的读取目录。
// struct dirent *readdir(DIR *dirp);
// 成功-返回struct dirent结构体的地址，失败-返回空地址。

// 步骤三：用closedir()关闭目录。
// int closedir(DIR *dirp);

// struct dirent
// {
//    long d_ino;                    			// inode number 索引节点号。
//    off_t d_off;                   			// offset to this dirent 在目录文件中的偏移。
//    unsigned short d_reclen;     		// length of this d_name 文件名长度。
//    unsigned char d_type;         		// the type of d_name 文件类型。
//    char d_name [NAME_MAX+1];    // file name文件名，最长255字符。
//};

// d_name-文件名或目录名。
// d_type-文件的类型，有多种取值，最重要的是8和4，8-常规文件（A regular file）；4-子目录（A directory），其它的暂时不关心。注意，d_name的数据类型是字符，不可直接显示。

int main(int argc, char* argv[])
{
    if(argc!=2){
        cout << "使用方法：./demo 目录名" << endl;
        return -1;
    }

    DIR* dir; //定义目录指针

    // 第一步，打开目录
    dir = opendir(argv[1]);
    if(dir==nullptr){
        cout << "目录：" << argv[1] << " 打开失败！" << endl;
        return -1;
    }

    // 用于存放从目录中读取的内容
    struct dirent* stdinfo = nullptr;
    while(true){
        stdinfo = readdir(dir);
        
        if (stdinfo==nullptr) break;

        cout << "文件名：" << stdinfo->d_name 
            << " 文件类型：" << (int)stdinfo->d_type
            << endl;
    }

    closedir(dir);
    
    return 0;
}